// app.js
App({
  onLaunch(options) {
    console.log('校园帮手小程序启动', options)

    // 检查更新
    this.checkForUpdate()

    // 初始化用户信息
    this.initUserInfo()

    // 设置网络状态监听
    this.setupNetworkListener()
  },

  onShow(options) {
    console.log('小程序显示', options)
  },

  onHide() {
    console.log('小程序隐藏')
  },

  onError(msg) {
    console.error('小程序错误:', msg)
    // 可以在这里上报错误日志
  },

  // 检查小程序更新
  checkForUpdate() {
    if (wx.canIUse('getUpdateManager')) {
      const updateManager = wx.getUpdateManager()

      updateManager.onCheckForUpdate((res) => {
        if (res.hasUpdate) {
          console.log('发现新版本')
        }
      })

      updateManager.onUpdateReady(() => {
        wx.showModal({
          title: '更新提示',
          content: '新版本已经准备好，是否重启应用？',
          success: (res) => {
            if (res.confirm) {
              updateManager.applyUpdate()
            }
          }
        })
      })

      updateManager.onUpdateFailed(() => {
        wx.showToast({
          title: '更新失败',
          icon: 'none'
        })
      })
    }
  },

  // 初始化用户信息
  initUserInfo() {
    const userInfo = wx.getStorageSync('userInfo')
    const token = wx.getStorageSync('token')
    const sessionKey = wx.getStorageSync('sessionKey')
    if (userInfo) {
      this.globalData.userInfo = userInfo
    }
    if (token) {
      this.globalData.token = token
    }
    if (sessionKey) {
      this.globalData.sessionKey = sessionKey
    }
  },

  // 设置网络监听
  setupNetworkListener() {
    wx.onNetworkStatusChange((res) => {
      this.globalData.isConnected = res.isConnected
      if (!res.isConnected) {
        wx.showToast({
          title: '网络连接异常',
          icon: 'none'
        })
      }
    })
  },

  // 全局数据
  globalData: {
    userInfo: null,
    userRole: 'student', // student, admin
    isConnected: true,
    baseUrl: 'http://localhost:3333/api', // 开发环境API地址
    // baseUrl: 'https://wdxyfw.cn/api',
    token: null,
    version: '1.0.0',

    // 系统配置
    config: {
      // 劳务类型配置（动态从labor_type表获取）
      laborTypes: [],

      // 订单状态
      orderStatus: {
        pending: '待接单',
        accepted: '已接单',
        processing: '进行中',
        completed: '已完成',
        cancelled: '已取消'
      },

      // 支付方式
      paymentMethods: {
        wechat: '微信支付',
        balance: '余额支付'
      }
    }
  },

  // 工具方法
  utils: {
    // 格式化时间
    formatTime(date) {
      const year = date.getFullYear()
      const month = date.getMonth() + 1
      const day = date.getDate()
      const hour = date.getHours()
      const minute = date.getMinutes()

      return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`
    },

    // 显示加载提示
    showLoading(title = '加载中...') {
      wx.showLoading({
        title,
        mask: true
      })
    },

    // 隐藏加载提示
    hideLoading() {
      wx.hideLoading()
    },

    // 显示成功提示
    showSuccess(title) {
      wx.showToast({
        title,
        icon: 'success'
      })
    },

    // 显示错误提示
    showError(title) {
      wx.showToast({
        title,
        icon: 'none'
      })
    },

    // 微信登录
    wechatLogin() {
      return new Promise((resolve, reject) => {
        wx.login({
          success: (res) => {
            if (res.code) {
              resolve(res.code)
            } else {
              reject(new Error('获取登录凭证失败'))
            }
          },
          fail: reject
        })
      })
    },

    // 获取用户信息
    getUserProfile() {
      return new Promise((resolve, reject) => {
        wx.getUserProfile({
          desc: '用于完善用户资料',
          success: (res) => {
            resolve(res) // 返回完整的响应对象，包含encryptedData和iv
          },
          fail: reject
        })
      })
    },

    // 调用API接口
    request(options) {
      const app = getApp()
      return new Promise((resolve, reject) => {
        const defaultOptions = {
          url: app.globalData.baseUrl + options.url,
          method: options.method || 'GET',
          data: options.data || {},
          header: {
            'Content-Type': 'application/json',
            ...options.header
          }
        }

        // 如果有token，添加到请求头
        if (app.globalData.token) {
          defaultOptions.header.Authorization = `Bearer ${app.globalData.token}`
        }

        wx.request({
          ...defaultOptions,
          success: (res) => {
            if (res.statusCode === 200) {
              if (res.data.code === 200) {
                resolve(res.data)
              } else {
                // 检查是否是 Token 失效错误
                const message = res.data.message || ''
                if (message.includes('Token验证失败') || message.includes('Token已失效') || message.includes('登录已过期')) {
                  // token过期，清除本地存储
                  app.utils.clearUserInfo()
                  
                  // 静默跳转到首页，不显示错误提示
                  wx.reLaunch({
                    url: '/pages/index/index'
                  })
                  reject(res.data)
                } else {
                  // 其他错误正常显示提示
                  app.utils.showError(message || '请求失败')
                  reject(res.data)
                }
              }
            } else if (res.statusCode === 401) {
              // token过期，清除本地存储
              app.utils.clearUserInfo()
              
              // 静默跳转到首页
              wx.reLaunch({
                url: '/pages/index/index'
              })
              reject(new Error('登录已过期'))
            } else {
              app.utils.showError('网络请求失败')
              reject(res)
            }
          },
          fail: (err) => {
            app.utils.showError('网络连接失败')
            reject(err)
          }
        })
      })
    },

    // 清除用户信息
    clearUserInfo() {
      const app = getApp()
      app.globalData.userInfo = null
      app.globalData.token = null
      app.globalData.sessionKey = null
      wx.removeStorageSync('userInfo')
      wx.removeStorageSync('token')
      wx.removeStorageSync('sessionKey')
    },

    // 保存用户信息
    saveUserInfo(userInfo, token) {
      const app = getApp()
      app.globalData.userInfo = userInfo
      app.globalData.token = token
      wx.setStorageSync('userInfo', userInfo)
      wx.setStorageSync('token', token)
    },

    // 登出功能
    async logout() {
      const app = getApp()

      try {
        // 如果有token，调用后端登出接口
        if (app.globalData.token) {
          try {
            await app.utils.request({
              url: '/auth/logout',
              method: 'POST'
            })
          } catch (error) {
            console.warn('调用登出接口失败:', error)
            // 即使后端登出失败，也要清除本地数据
          }
        }

        // 清除所有用户相关数据
        app.utils.clearUserInfo()

        // 清除其他可能的数据
        wx.removeStorageSync('sessionKey')
        wx.removeStorageSync('userSettings')

        // 重置全局数据
        app.globalData.userInfo = null
        app.globalData.token = null
        app.globalData.sessionKey = null

        return true
      } catch (error) {
        console.error('登出失败:', error)
        return false
      }
    },

    // 检查登录状态
    checkLoginStatus() {
      const app = getApp()
      const hasLogin = !!(app.globalData.token && app.globalData.userInfo)
      
      if (hasLogin) {
        // 检查Token是否即将过期
        this.checkTokenExpiry(app.globalData.token)
      }
      
      return hasLogin
    },

    // 检查Token过期时间
    checkTokenExpiry(token) {
      try {
        // 解析JWT Token获取过期时间
        const payload = JSON.parse(atob(token.split('.')[1]))
        const exp = payload.exp * 1000 // 转换为毫秒
        const now = Date.now()
        const oneDay = 24 * 60 * 60 * 1000 // 1天的毫秒数
        
        // 如果Token在1天内过期，提醒用户
        if (exp - now < oneDay) {
          wx.showModal({
            title: '登录即将过期',
            content: '您的登录状态即将过期，建议重新登录以确保正常使用',
            showCancel: true,
            cancelText: '稍后提醒',
            confirmText: '重新登录',
            success: (res) => {
              if (res.confirm) {
                wx.navigateTo({
                  url: '/pages/login/login'
                })
              }
            }
          })
        }
      } catch (error) {
        console.error('检查Token过期时间失败:', error)
      }
    },

    // 检查学校ID
    checkSchoolId() {
      const app = getApp()
      const userInfo = app.globalData.userInfo
      
      // 检查是否已登录
      if (!app.globalData.token || !userInfo) {
        return false
      }
      
      // 检查是否有学校ID
      if (!userInfo.schoolId) {
        return false
      }
      
      return true
    },

    // 要求选择学校
    requireSchoolSelection(redirectUrl) {
      wx.showModal({
        title: '选择学校',
        content: '请先选择您所在的学校，才能继续使用',
        showCancel: false,
        confirmText: '去选择',
        success: () => {
          // 保存重定向URL
          if (redirectUrl) {
            wx.setStorageSync('schoolSelectRedirect', redirectUrl)
          }
          wx.redirectTo({
            url: '/pages/school-select/school-select',
            fail: () => {
              wx.reLaunch({
                url: '/pages/school-select/school-select'
              })
            }
          })
        }
      })
    }
  }
})
